#include<stdio.h>

#define MAXSIZE 100
typedef int ElemType; //将int 定义为ElemType，方便对相关的所有变量直接统一修改

//创建顺序表
typedef struct{
    ElemType data[MAXSIZE];
    int length;
}SeqList;

//顺序表初始化
void initList(SeqList *L)
{
    L -> length = 0;
}

//在尾部添加元素
int appendElem(SeqList *L, ElemType e)
{
    if(L->length >= MAXSIZE)
    {
        printf("顺序表已满\n");
        return 0;
    } 
    L->data[L->length] = e;
    L->length++;
    return 1;
}

//遍历顺序表
void listElem(SeqList *L)
{
    for(int i = 0; i < L->length; i++) //用的是小于。i是角标，length是元素个数，必须i<length。
    {
        printf("%d",L->data[i]);
    }
    printf("\n");
}

//插入元素
int insertElem(SeqList *L, int pos, ElemType e)
{
    if(L->length >= MAXSIZE)
    {
        printf("表已满\n");
        return 0;
    }
    if(pos < 1 || pos > L->length)
    {
        printf("插入位置错误\n");
        return 0;
    }
    if(pos <= L->length)
    {
        for(int i = L->length-1; i >= pos-1; i--)
        {
            L->data[i+1] = L->data[i];
        }
        L->data[pos-1] = e;
        L->length++;  
    }
    return 1;
}

//删除元素
int deleteElem(SeqList *L, int pos, ElemType *e)
{
    if(L->length == 0)
    {
        printf("空表\n");
        return 0;
    }
    if(pos < 1 || pos > L->length)
    {
        printf("删除数据位置错误\n");
        return 0;
    }

    *e = L->data[pos-1]; //用来返回删除的元素具体是哪个值。

    if(pos < L->length)  //可以不用=。如果等于的话说明删的最后一个元素，那么直接length-1就读不到了。
    {
        for(int i = pos-1; i < L->length -1; i++)
        {
            L->data[i] = L->data[i+1];
        }
    }
    L->length--;
    return 1;
}

//查找数据位置
int findElem(SeqList *L, ElemType e)
{
    if(L->length == 0)
    {
        printf("空表\n");
        return 0;
    }
    for(int i = 0; i <= L->length; i++)
    {
        if(L->data[i] == e)
        {
            return i+1;
        }
    }
}

int main()
{
    SeqList list;
    initList(&list);
    printf("初始化成功，目前长度占用%d\n",list.length);
    printf("目前占用内存%zu字节\n",sizeof(list.data));
    appendElen(&list,1);


    return 0;
}